package com.smartleanx.module.hrm.service.esign.auth.impl;

import com.alibaba.fastjson2.JSONObject;
import com.smartleanx.module.hrm.service.esign.auth.EsignCommonService;
import com.smartleanx.module.hrm.service.esign.temp.vo.Auth.EsignProperties;
import com.smartleanx.module.hrm.service.esign.vo.*;
import com.smartleanx.module.hrm.util.esign.enums.EsignRequestType;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.Collections;
import java.util.List;

/**
 * 印章服务（页面版）
 *
 * @author yanglihao
 */
@Slf4j
@Service
@AllArgsConstructor
public class EsignSealUrlService extends EsignCommonService {

    private EsignProperties properties;


    /**
     * 获取创建个人印章页面链接
     *
     * @apiNote 必须确保个人用户已授予平台appId获取其印章资源管理权限
     */
    public SealUrlCommonResp getPsnSealCreateUrl(SealCreateUrlReq param) throws Exception {
        String apiAddr = "/v3/seals/psn-seal-create-url";
        return baseRequest(properties, EsignRequestType.POST, apiAddr, param, SealUrlCommonResp.class);
    }

    /**
     * 获取管理个人印章页面链接
     *
     * @param psnId 个人账号ID
     */
    public SealUrlCommonResp getPsnSealsManageUrl(String psnId) throws Exception {
        String apiAddr = "/v3/seals/psn-seals-manage-url";
        JSONObject param = new JSONObject();
        param.put("psnId", psnId);
        return baseRequest(properties, EsignRequestType.POST, apiAddr, param, SealUrlCommonResp.class);
    }

    /**
     * 【精简】获取(模板)创建机构印章页面链接
     *
     * @param orgId           机构账号ID
     * @param transactorPsnId 机构经办人账号ID
     * @param customBizNum    自定义业务编号
     * @param redirectUrl     重定向地址
     * @apiNote 必须确保个人用户已授予平台appId获取其印章资源管理权限
     */
    public SealUrlCommonResp getOrgSealCreateUrl(String orgId, String transactorPsnId, String customBizNum,
                                                 String redirectUrl) throws Exception {
        return getOrgSealCreateUrl(orgId, transactorPsnId, customBizNum, null, SealCreateMode.template, null, null,
                null, null, redirectUrl, Collections.singletonList("sealCreateMode"));
    }

    /**
     * 【完整】获取创建机构印章页面链接
     *
     * @param orgId             机构账号ID
     * @param transactorPsnId   机构经办人账号ID
     * @param customBizNum      自定义业务编号
     * @param sealName          印章名称
     * @param sealCreateMode    制章方式
     * @param sealTemplateStyle 模板印章样式
     * @param sealSize          印章尺寸
     * @param sealColor         印章颜色
     * @param sealOpacity       印章不透明度
     * @param redirectUrl       重定向地址
     * @param uneditableFields  页面中不可编辑的字段
     * @apiNote 必须确保个人用户已授予平台appId获取其印章资源管理权限
     */
    public SealUrlCommonResp getOrgSealCreateUrl(String orgId, String transactorPsnId, String customBizNum,
                                                 String sealName, SealCreateMode sealCreateMode, SealTemplateStyle sealTemplateStyle, String sealSize,
                                                 SealColor sealColor, Long sealOpacity, String redirectUrl, List<String> uneditableFields)
            throws Exception {
        OrgSealCreateUrlReq sealCreateUrlReq = OrgSealCreateUrlReq.builder()
                // 机构账号ID
                .orgId(orgId)
                // 机构经办人账号ID
                .transactorPsnId(transactorPsnId)
                // 自定义业务编号
                .customBizNum(customBizNum)
                // 印章名称
                .sealName(sealName)
                // 制章方式
                .sealCreateMode(sealCreateMode)
                // 模板印章样式
                .sealTemplateStyle(sealTemplateStyle)
                // 印章尺寸
                .sealSize(sealSize)
                // 印章颜色
                .sealColor(sealColor)
                // 印章不透明度
                .sealOpacity(sealOpacity)
                // 重定向地址
                .redirectUrl(redirectUrl)
                // 页面中不可编辑的字段
                .uneditableFields(uneditableFields).build();
        return getOrgSealCreateUrl(sealCreateUrlReq);
    }

    /**
     * 【通用】获取创建机构印章页面链接
     *
     * @apiNote 必须确保企业用户已授予平台appId获取其印章资源管理的权限
     */
    public SealUrlCommonResp getOrgSealCreateUrl(OrgSealCreateUrlReq param) throws Exception {
        String apiAddr = "/v3/seals/org-seal-create-url";
        return baseRequest(properties, EsignRequestType.POST, apiAddr, param, SealUrlCommonResp.class);
    }

    /**
     * 获取管理机构印章页面链接
     *
     * @param orgId           机构账号ID
     * @param transactorPsnId 机构经办人账号ID
     * @apiNote 必须确保企业用户已授予平台appId获取其印章资源管理的权限
     */
    public SealUrlCommonResp getOrgSealsManageUrl(String orgId, String transactorPsnId) throws Exception {
        String apiAddr = "/v3/seals/org-seals-manage-url";
        JSONObject param = new JSONObject();
        param.put("orgId", orgId);
        param.put("transactorPsnId", transactorPsnId);
        return baseRequest(properties, EsignRequestType.POST, apiAddr, param, SealUrlCommonResp.class);
    }



}
